import { defineStore } from 'pinia'
import { computed, reactive, ref, toRefs } from 'vue'
import { loginApi, logoutApi } from '@/api/common/account'
import { message } from 'ant-design-vue'
import { useRouter } from 'vue-router'
import { AuthOperationType } from '@/router/const'

/** 用户基础信息类型 */
interface UserInfo {
  /** 血型编码（空字符串表示未填写） */
  bloodTypeCd?: string
  /** 唯一标识ID */
  cdId?: string
  /** 企业统一社会信用代码 */
  companyCode?: string
  /** 企业ID */
  companyId?: string
  /** 企业LOGO完整URL */
  companyImgUrl?: string
  /** 企业注册名称 */
  companyName?: string
  /** 企业发起人ID */
  companyPromoter?: string
  /** 企业法人真实姓名 */
  companyRealName?: string
  /** 身份证号（空字符串表示未填写） */
  ctzidNo?: string
  /** 所属部门名称 */
  depName?: string
  /** 部门层级 */
  departmentLevel?: string
  /** 部门职位编码 */
  departmentPosition?: string
  /** 电子邮箱（空字符串表示未填写） */
  email?: string
  /** 性别（1-男 2-女 0-未知） */
  gender?: '0' | '1' | '2'
  /** 是否当前用户数据 */
  mine?: 'true' | 'false'
  /** 手机号码（带国际区号格式） */
  mobile?: string
  /** 头像图片原始路径（已弃用字段） */
  portraitImg?: string
  /** 头像完整URL */
  portraitImgUrl?: string
  /** 账号主体标识 */
  principal?: string
  /** 用户档案ID */
  profileId?: string
  /** 用户真实姓名 */
  realName?: string
  /** 状态码（1-正常 0-禁用） */
  stateCd?: '0' | '1'
}

type IUserInfo = {
  token: string
  companyId: string
  companyCode: string
  profileId: string
  profileName: string
  userInfo: UserInfo
}

export const useUserStore = defineStore(
  'user',
  () => {
    const state: IUserInfo = reactive({
      token: '',
      companyId: '',
      companyCode: '',
      profileId: '',
      profileName: '',
      userInfo: {},
    })

    const authList = ref<Array<string>>([])

    const router = useRouter()

    const hasToken = computed(() => !!state.token)

    // 登录
    const login = async () => {
      const params = {
        userName: '19965267708',
        passWord: 'xr5201314.',
        terminaltype: 'WEB',
        auto: '0',
      }
      const { msg, data } = await loginApi.getData(params)
      message.success(msg || '登录成功')
      state.token = data.auth.accessToken
      state.companyId = data.companyId
      state.companyCode = data.companyCode
      state.profileId = data.userInfo.profileId
      state.profileName = data.userInfo.realName
      state.userInfo = data.userInfo
      authList.value = data.authList
      router.push('/')
    }

    // 登出
    const logout = async () => {
      const params = {
        token: state.token,
      }
      const { msg } = await logoutApi(params)
      message.success(msg || '登出成功')
      $reset()
      router.push({
        path: '/login',
        query: {
          type: AuthOperationType.Login,
        },
      })
    }

    // 清空
    const $reset = () => {
      state.token = ''
      state.companyId = ''
      state.companyCode = ''
      state.profileId = ''
      state.profileName = ''
      state.userInfo = {}
    }

    return {
      ...toRefs(state),
      hasToken,
      login,
      logout,
      $reset,
    }
  },
  {
    persist: true,
  },
)
